package tt.dz.egobus.servicemanager.base.service;

import tt.dz.egobus.base.service.BaseService;
import tt.dz.egobus.bean.CriteriaRestrictionsBuilder;
import tt.dz.egobus.bean.Pagination;
import tt.dz.egobus.servicemanager.bean.PagingationStart;
import tt.dz.egobus.servicemanager.core.exception.BusinessException;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author Anson
 * @date 17-3-14
 * @name
 * @since 1.0.1
 */
public interface ExtendBaseService<E extends Serializable, PK extends Serializable> extends BaseService<E, PK> {


    /**
     * @param pk 主键
     * @throws BusinessException 未查寻到对应的实体
     * @author Anson
     * @date 17-3-14
     * @name 根据主键删除
     * @since 1.0.1
     */
    void deletePK(PK pk);

    /**
     * 查询列表
     *
     * @param params 带有查询匹配模式查询Key的参数集合
     *               <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     *               <p>
     *               具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     *               <p>
     *               例如：key举例
     *               <table>
     *               <tr>
     *               <th>示例</th>
     *               <th>说明</th>
     *               </tr>
     *               <tr>
     *               <td>eq#anson</td>
     *               <td>过滤 值 等于 anson </td>
     *               </tr>
     *               <tr>
     *               <td>like#anson</td>
     *               <td>过滤 值 前后模糊查询 anson </td>
     *               </tr>
     *               </table>
     * @return
     */
    List<E> list(Map<String, Object> params);

    /**
     * 查询列表，带有排序规则
     *
     * @param params 带有查询匹配模式查询Key的参数集合
     * @param orders 排序规则
     *               <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     *               <p>
     *               具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     *               <p>
     *               例如：key举例
     *               <table>
     *               <tr>
     *               <th>示例</th>
     *               <th>说明</th>
     *               </tr>
     *               <tr>
     *               <td>eq#anson</td>
     *               <td>过滤 值 等于 anson </td>
     *               </tr>
     *               <tr>
     *               <td>like#anson</td>
     *               <td>过滤 值 前后模糊查询 anson </td>
     *               </tr>
     *               </table>
     * @return
     */
    List<E> list(Map<String, Object> params, List<String> orders);

    /**
     * 查询数量
     *
     * @param params 带有查询匹配模式查询Key的参数集合
     *               <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     *               <p>
     *               具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     *               <p>
     *               例如：key举例
     *               <table>
     *               <tr>
     *               <th>示例</th>
     *               <th>说明</th>
     *               </tr>
     *               <tr>
     *               <td>eq#anson</td>
     *               <td>过滤 值 等于 anson </td>
     *               </tr>
     *               <tr>
     *               <td>like#anson</td>
     *               <td>过滤 值 前后模糊查询 anson </td>
     *               </tr>
     *               </table>
     * @return
     */
    int count(Map<String, Object> params);


    /**
     * 给予QBC查询
     * 查询当前实体的分页功能实现
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     * <tr>
     * <th>示例</th>
     * <th>说明</th>
     * </tr>
     * <tr>
     * <td>eq#anson</td>
     * <td>过滤 值 等于 anson </td>
     * </tr>
     * <tr>
     * <td>like#anson</td>
     * <td>过滤 值 前后模糊查询 anson </td>
     * </tr>
     * </table>
     *
     * @param params        当前类中查询的参数，非分页信息的参数
     * @param currentPageNo 当前页码
     * @param maxResult     查询的条数
     * @return
     */
    Pagination<E> pagination(Map<String, Object> params, int currentPageNo, int maxResult);

    /**
     * 给予QBC查询
     * <br>查询当前实体的分页功能实现
     * <br>天价了排序功能
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     * <tr>
     * <th>示例</th>
     * <th>说明</th>
     * </tr>
     * <tr>
     * <td>eq#anson</td>
     * <td>过滤 值 等于 anson </td>
     * </tr>
     * <tr>
     * <td>like#anson</td>
     * <td>过滤 值 前后模糊查询 anson </td>
     * </tr>
     * </table>
     *
     * @param params            当前类中查询的参数，非分页信息的参数
     * @param currentPageNo     当前页码
     * @param maxResult         查询的条数
     * @param orderPropertyList 排序字段
     * @return
     */
    Pagination<E> pagination(Map<String, Object> params, int currentPageNo, int maxResult, List<String> orderPropertyList);

    /**
     * @param ids 逐渐即可
     * @author Anson
     * @date 17-3-15
     * @name 根据id集合查询集合
     * @since 1.0.1
     */
    List<E> queryByIds(PK[] ids);

    /**
     * @author Anson
     * @date 17-3-21
     * @name 获取当前db时间
     * @since 1.0.2
     */
    Date getCurrentDbDate();


    /**
     * 给予QBC查询
     * <br>查询当前实体的分页功能实现
     * <br>天价了排序功能
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     * <tr>
     * <th>示例</th>
     * <th>说明</th>
     * </tr>
     * <tr>
     * <td>eq#anson</td>
     * <td>过滤 值 等于 anson </td>
     * </tr>
     * <tr>
     * <td>like#anson</td>
     * <td>过滤 值 前后模糊查询 anson </td>
     * </tr>
     * </table>
     *
     * @param params    当前类中查询的参数，非分页信息的参数
     * @param start     当前从第几个数据开始查询
     * @param maxResult 查询的条数
     * @author Anson
     * @date 17-4-13
     * @name
     * @since 1.0.4
     */
    PagingationStart<E> paginationStart(Map<String, Object> params, int start, int maxResult);

    /**
     * 给予QBC查询
     * <br>查询当前实体的分页功能实现
     * <br>天价了排序功能
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     * <tr>
     * <th>示例</th>
     * <th>说明</th>
     * </tr>
     * <tr>
     * <td>eq#anson</td>
     * <td>过滤 值 等于 anson </td>
     * </tr>
     * <tr>
     * <td>like#anson</td>
     * <td>过滤 值 前后模糊查询 anson </td>
     * </tr>
     * </table>
     *
     * @param params            当前类中查询的参数，非分页信息的参数
     * @param start             当前从第几个数据开始查询
     * @param maxResult         查询的条数
     * @param orderPropertyList 排序字段
     * @author Anson
     * @date 17-4-13
     * @name
     * @since 1.0.4
     */
    PagingationStart<E> paginationStart(Map<String, Object> params, int start, int maxResult, List<String> orderPropertyList);
}
